#ifndef PROTOCOL_H
#define PROTOCOL_H

#include <cstdint>
#include <vector>

// 协议常量定义
namespace Protocol {
    const uint16_t FRAME_HEADER = 0xAA55;  // 帧头（小端格式）
    const uint8_t HOST_ID = 0xFE;          // 上位机ID
    const uint8_t BROADCAST_ID = 0xFF;     // 广播ID
    
    // 命令字定义
    const uint8_t CMD_REAL_TIME_CONTROL = 0x02;  // 实时控制
    const uint8_t CMD_GET_HAND_PARAMS = 0x03;    // 获取参数
}

// CRC16计算函数声明
uint16_t calculateCRC16(const uint8_t* data, size_t length);

// 关节期望控制参数结构体
struct JointParamsDownlink {
    uint16_t kp;           // 比例增益参数           范围：-10000~10000   编码：(uint16_t)(((int32_t)kp + 10000) * 65535 / 20000);
    uint16_t ki;           // 积分系数               范围：-10000~10000   编码：(uint16_t)(((int32_t)ki + 10000) * 65535 / 20000);
    uint16_t kd;           // 微分增益参数           范围：-10000~10000   编码：(uint16_t)(((int32_t)kd + 10000) * 65535 / 20000);
    uint16_t position;     // 设定位置（单位：弧度） 范围：-3.1415~3.1415   编码：(uint16_t)(((position + 3.1415f) * 65535.0f) / (2.0f * 3.1415f));
    uint16_t current_max;  // 电流上限             范围：-1000~1000   编码：(uint16_t)(((int32_t)current_max + 1000) * 65535 / 2000);
    uint16_t mode;         // 控制模式（3=位置控制） 范围：0~3  0：关闭控制  1：电流控制  2：速度控制  3：位置控制
    uint16_t res0;         // 调试参数1（预留/扩展）
    uint16_t res1;         // 调试参数2（预留/扩展）
    uint16_t res2;         // 调试参数3（预留/扩展）
    uint16_t res3;         // 调试参数4（预留/扩展）
} __attribute__((packed));

// 关节状态反馈结构体
struct JointParamsUplink {
    uint16_t position;   // 实时位置（弧度） 范围：-3.1415~3.1415  解码：(((float)position) * 2.0f * 3.1415f / 65535.0f) - 3.1415f;
    uint16_t Iq;         // 实时Q轴电流（单位：mA） 范围：-1000~1000 解码：(int16_t)((((int32_t)Iq * 2000) / 65535) - 1000);
    uint16_t Id;         // 实时D轴电流（单位：mA） 范围：-1000~1000 解码：(int16_t)((((int32_t)Id * 2000) / 65535) - 1000);
    uint16_t default1;   // 预留占位
    uint16_t default2;   // 预留占位
    uint16_t default3;   // 预留占位
    uint16_t default4;   // 预留占位
    uint16_t default5;   // 预留占位
    uint16_t default6;   // 预留占位
    uint16_t default7;   // 预留占位
} __attribute__((packed));

// 三维力数据结构体
struct YddsData {
    uint32_t nf;      // 法向力 (0~2^24-1)
    uint32_t tf;      // 切向力 (0~2^24-1)
    uint16_t tfDir;   // 切向力变化方向  负向 0: 无变化 1: 正向
} __attribute__((packed));

// 传感器参数结构体
struct SensorParam {
    uint8_t id;               // 传感器ID 0~17
    uint32_t channelData[11]; // 通道数据 (0~2^24-1)
    YddsData yddsData[2];     // 三维力数据
    uint32_t sProxData;       // 接近觉数据 (0~2^24-1)
} __attribute__((packed));

typedef struct {
    uint8_t sensorID;           //传感器id对应关节id
    uint32_t channelData[13];   //通道数据
    YddsData yddsData[2];         //三维力
    uint32_t sProxData[2];      //接近觉
} __attribute__((packed)) SensorParam_Palm_t;//手掌 30号传感器 数据结构

// 下行数据包（上位机->灵巧手）
struct RS485Downlink {
    JointParamsDownlink jointParams[21];  // 21个关节参数
} __attribute__((packed));

// 上行数据包（灵巧手->上位机）
struct RS485Uplink {
    JointParamsUplink jointParams[21];    // 21个关节状态
    SensorParam sensorParams[18];         // 18个传感器数据
    SensorParam_Palm_t  SensorParam_Palm; // 手掌传感器数据
} __attribute__((packed));

// 灵巧手参数结构体
struct HandParam {
    int16_t position_stretching[12];  // 伸展位置参数
    int16_t position_closing[12];     // 收拢位置参数
    int16_t position_zero[12];        // 零位位置参数
    int16_t position_init[12];        // 初始位置参数
    int8_t  angle_stretching[12];     // 伸展角度参数
    int8_t  angle_closing[12];        // 收拢角度参数
} __attribute__((packed));

// 用户数据结构体
struct UserData {
    uint16_t reverse;        // 保留字段
    char ev_hand;            // 左右手属性  'L'/"l" 左手 'R'/"r" 右手
    uint8_t hand_id;         // 通信识别ID   默认0
    char SN[32];             // 生产序列号 
    char name[32];           // 用户自定义别名 最大长度32个字符
    HandParam handparam;     // 校准参数
} __attribute__((packed));

#endif // PROTOCOL_H